package com.nuc.seckill.dao;

import com.nuc.seckill.base.CommonQueryBean;
import com.nuc.seckill.model.SeckillProducts;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * SeckillProducts数据库操作接口类
 *
 * @author spider
 */

@Repository
public interface SeckillProductsDao {


    /**
     * 查询（根据主键ID查询）
     *
     * @param id id
     * @return com.nuc.seckill.model.SeckillProducts
     * @author 石一歌
     * @date 2022/8/11 15:04
     */
    SeckillProducts selectByPrimaryKey(@Param("id") Long id);

    /**
     * 删除（根据主键ID删除）
     *
     * @param id id
     * @return int
     * @author 石一歌
     * @date 2022/8/11 15:04
     */
    int deleteByPrimaryKey(@Param("id") Long id);

    /**
     * 添加
     *
     * @param record 记录
     * @return int
     * @author 石一歌
     * @date 2022/8/11 15:04
     */
    int insert(SeckillProducts record);

    /**
     * 修改 （匹配有值的字段）
     *
     * @param record 记录
     * @return int
     * @author 石一歌
     * @date 2022/8/11 15:04
     */
    int updateByPrimaryKeySelective(SeckillProducts record);

    /**
     * list分页查询
     *
     * @param record 记录
     * @param query  查询条件
     * @return java.util.List<com.nuc.seckill.model.SeckillProducts>
     * @author 石一歌
     * @date 2022/8/11 15:04
     */
    List<SeckillProducts> list4Page(SeckillProducts record, @Param("commonQueryParam") CommonQueryBean query);

    /**
     * count查询
     *
     * @param record 记录
     * @return long
     * @author 石一歌
     * @date 2022/8/11 15:03
     */
    long count(SeckillProducts record);

    /**
     * list查询
     *
     * @param record 记录
     * @return java.util.List<com.nuc.seckill.model.SeckillProducts>
     * @author 石一歌
     * @date 2022/8/11 15:03
     */
    List<SeckillProducts> list(SeckillProducts record);

    /**
     * 加锁读
     *
     * @param productId 产品id
     * @return com.nuc.seckill.model.SeckillProducts
     * @author 石一歌
     * @date 2022/8/10 20:51
     */
    SeckillProducts selectByPrimaryKeyForUpdate(Long productId);

    /**
     * 乐观锁更新
     *
     * @param productId 产品id
     * @return int
     * @author 石一歌
     * @date 2022/8/10 21:44
     */
    int updateStockByOptimistic(Long productId);

    /**
     * 扣减库存
     *
     * @param productId 产品id
     * @author 石一歌
     * @date 2022/8/11 15:48
     */
    void decrStock(Long productId);
}